闲扯
忘开 $long\ long$ 调了半天。。。
题面
Solution
每一个单词的出现次数看做权值。
因为两个单词对应的字符串不能有包含,所以如果我们对所有的字符串建一颗 $Trie$ 树,那么每个字符串的结尾一定是位于叶节点的。
我们可以把每个单词的权值付给每一个对应的叶节点,那么问题就变成了:建立一颗 $Trie$ 树,最小化 $\sum val_i*l_i$ 。其中 $val$ 表示叶节点的权值, $l$ 表示单词长度(即在树中的深度)。
又因为是 $k$ 进制,所以我们建出的一定是一个 $k$ 叉树。
总结一下上面的转化,我们可以发现这道题就是要我们求一个 $k$ 叉的 $Huffman$ 树。
同时我们还要保证字符串的长度最大值最小,所以我们每次合并时,尽量选择长度短的来合并。
Code
1 |
|
总结
很巧妙的一道题。
只要想到了问题转化,就变得很简单了。